package cn.jimmie.learn.sdk.async;


import android.os.AsyncTask;

import java.io.File;
import java.lang.ref.WeakReference;

import cn.jimmie.learn.pbc.base.BaseActivity;
import cn.jimmie.learn.pbc.http.MockHttp;
import cn.jimmie.learn.pbc.resource.PluginConst;
import cn.jimmie.learn.pbc.util.Utils;

/**
 * function :
 *
 * <p> Create Time: 2019年02月14日 21:59 </p>
 * <p> @author Jimmie.Qian  </p>
 */
public class LoadLocalPluginTask extends AsyncTask<String, Integer, Integer> {
    //    private static final int FROM_ASSERT = 0;
    private static final int FROM_DATA = 1;
    private static final int FROM_REMOTE = 2;

    private WeakReference<BaseActivity> mHost;

    private OnLocalPluginListener mListener;

    public void setListener(OnLocalPluginListener listener) {
        this.mListener = listener;
    }

    public LoadLocalPluginTask(BaseActivity host) {
        mHost = new WeakReference<>(host);
    }

    @Override
    protected Integer doInBackground(String... strings) {
        int result = FROM_REMOTE;
        BaseActivity activity = mHost.get();

        // 1. 获取服务端插件最新版本的md5
        String remotePluginMd5 = MockHttp.getRemotePluginMd5();
        System.out.println("remotePluginMd5 : " + remotePluginMd5);

        // 2. 检查 /data/data/files 中是否有插件,有则对比服务端的插件
        File dataPlugin = activity.getFileStreamPath(PluginConst.PLUGIN_NAME);
        if (dataPlugin.exists()) {
            String dataPluginMd5 = Utils.md5(dataPlugin);
            System.out.println("dataPluginMd5 : " + dataPluginMd5);
            // 2.1 如果信息一致, 则直接使用 data/data 下的插件
            if (remotePluginMd5.equals(dataPluginMd5)) {
                result = FROM_DATA;
            }
        }

//        // 这一步骤可以不做检查, 因为 data/data 中的数据肯定比assert的新
//        // 3. 检查asserts下的插件
//        String assertPluginMd5 = getAssertPluginMd5();
//        System.out.println("assertPluginMd5 : " + assertPluginMd5);
//        if (result != FROM_DATA && assertPluginMd5.equals(remotePluginMd5)) {
//            Utils.extractAssets(activity, PluginConst.PLUGIN_NAME);
//            result = FROM_ASSERT;
//        }

        // 判定使用本地插件
//        if (result != FROM_REMOTE) {
//            PluginManager.instance().setPluginClassLoader(PluginUtils.
//                    loadPluginManager(activity, PluginConst.PLUGIN_NAME));
//        }
        return result;
    }

//    private String getAssertPluginMd5() {
//        try {
//            InputStream inputStream = mHost.get().getAssets().open(PluginConst.PLUGIN_NAME);
//            return Utils.md5(inputStream);
//        } catch (IOException e) {
//            return "";
//        }
//    }

    @Override
    protected void onPostExecute(Integer result) {
        if (mListener != null) {
            mListener.onLoadLocalPluginFinished(result != FROM_REMOTE);
        }
    }

    public interface OnLocalPluginListener {
        void onLoadLocalPluginFinished(boolean useLocal);
    }
}
